package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.beans.CotizacionConEstadosBusquedaBean;
import com.divemotor.ventarepuestosinternet.dao.CotizacionConEstadosDAO;
import com.divemotor.ventarepuestosinternet.model.CotizacionConEstados;
import com.divemotor.ventarepuestosinternet.model.Sucursal;
import com.divemotor.ventarepuestosinternet.util.Constantes;

@SuppressWarnings("unchecked")
@Repository(value = "cotizacionConEstadosDAO")
public class CotizacionConEstadosDAOImpl implements CotizacionConEstadosDAO, Serializable {

	private static final long serialVersionUID = -5665318731021316365L;

	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public List<CotizacionConEstados> buscar(CotizacionConEstadosBusquedaBean cotizacionConEstadosBusquedaBean) {
		
		if (cotizacionConEstadosBusquedaBean.getListaSucursalesPermitidas() != null && cotizacionConEstadosBusquedaBean.getListaSucursalesPermitidas().size() > 0) {
			
			List<Integer> listaIdsSucursalesPermitidas = new ArrayList<Integer>();
			
			for (Sucursal sucursal : cotizacionConEstadosBusquedaBean.getListaSucursalesPermitidas()) {
				listaIdsSucursalesPermitidas.add(sucursal.getIdSucursal());
			}
		
			Criteria criteria = sessionFactory.getCurrentSession().createCriteria(CotizacionConEstados.class);
			
			if (cotizacionConEstadosBusquedaBean.getCotizacionConEstados() != null) {
				
				if (cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdCotizacion() != null
						&& !cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdCotizacion().equals(Constantes.NO_SELECCIONADO)) {
					criteria.add(Restrictions.eq("idCotizacion", cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdCotizacion()));
				}
				
				if (cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdDepartamento() != null
						&& !cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdDepartamento().equals(Constantes.NO_SELECCIONADO)) {
					criteria.add(Restrictions.eq("idDepartamento", cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdDepartamento()));
				}
				
				if (cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdProvincia() != null
						&& !cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdProvincia().equals(Constantes.NO_SELECCIONADO)) {
					criteria.add(Restrictions.eq("idProvincia", cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdProvincia()));
				}
				
				if (cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdDistrito() != null
						&& !cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdDistrito().equals(Constantes.NO_SELECCIONADO)) {
					criteria.add(Restrictions.eq("idDistrito", cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdDistrito()));
				}
				
				if (cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdSucursal() != null
						&& !cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdSucursal().equals(Constantes.NO_SELECCIONADO)) {
					criteria.add(Restrictions.eq("idSucursal", cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdSucursal()));
				}
				
				if (cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdEstadoCotizacion() != null
						&& !cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdEstadoCotizacion().equals(Constantes.NO_SELECCIONADO)) {
					criteria.add(Restrictions.eq("idEstadoCotizacion", cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdEstadoCotizacion()));
				}
				
				if (cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdVendedor() != null
						&& !cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdVendedor().equals(Constantes.NO_SELECCIONADO)) {
					criteria.add(Restrictions.eq("idVendedor", cotizacionConEstadosBusquedaBean.getCotizacionConEstados().getIdVendedor()));
				}
			}
			
			criteria.add(Restrictions.in("idSucursal", listaIdsSucursalesPermitidas));
			
			if ((cotizacionConEstadosBusquedaBean.getFechaInicio() != null) && (cotizacionConEstadosBusquedaBean.getFechaFin() != null)) {
				criteria.add(Restrictions.between("fechaCreacion", cotizacionConEstadosBusquedaBean.getFechaInicio(), cotizacionConEstadosBusquedaBean.getFechaFin()));
			} else if ((cotizacionConEstadosBusquedaBean.getFechaInicio() != null) && (cotizacionConEstadosBusquedaBean.getFechaFin() == null)) {
				criteria.add(Restrictions.ge("fechaCreacion", cotizacionConEstadosBusquedaBean.getFechaInicio()));
			} else if ((cotizacionConEstadosBusquedaBean.getFechaInicio() == null) && (cotizacionConEstadosBusquedaBean.getFechaFin() != null)) {
				criteria.add(Restrictions.le("fechaCreacion", cotizacionConEstadosBusquedaBean.getFechaFin()));
			}
			
			if (!(cotizacionConEstadosBusquedaBean.getColumnaOrden() == null)) {
				if (cotizacionConEstadosBusquedaBean.getOrden().toString().equals(Constantes.ORDEN_ASCENDENTE_PRIMEFACES))
					criteria.addOrder(Order.asc(cotizacionConEstadosBusquedaBean.getColumnaOrden()));
				else {
						criteria.addOrder(Order.desc(cotizacionConEstadosBusquedaBean.getColumnaOrden()));
				}	
			}else{
				criteria.addOrder(Order.asc("idCotizacion"));
			}
			
			return criteria.list();
			
		} else {
			
			return new ArrayList<CotizacionConEstados>();
			
		}
	}

}
